//
// Created by fh on 2021/5/28.
//

#ifndef CDEMO_LINKLIST_H
#define CDEMO_LINKLIST_H

#include <stdio.h>
#include <stdlib.h>
#include "CustomDefine.h"

/* 线性表的存储结构:链式.!链表操作注意一些赋值之后地址丢失的问题就问题不大 */
typedef int ElemType;
typedef struct node {
    ElemType data;
    struct node *next;
} Node;

/* 在L中第i个位置之前插入新的数据元素e，L的长度加1 */
Status LinkListInsert(Node *headerNode,int i,ElemType e);
/* 删除L的第i个数据元素，并用e返回其值，L的长度-1 */
Status LinkListDelete(Node *headerNode,int i,ElemType *e);
/* 用e值修改L的第i个元素数据 */
Status LinkListModify(Node *headerNode,int i,ElemType e);
/* 用e返回L中第i个数据元素的值 */
Status LinkListGetElem(Node headerNode,int i,ElemType *e);
/* 打印单链表 */
Status LinkListDisplay(Node headerNode);
/* 另一种打印单链表,L指向的Node节点不能修改，如果不设置为const那么有可能在函数里动了L的属性值 */
Status LinkListAnotherDisplay(const Node *L);
/* 随机产生n个元素的值，建立带头结点的单链线性表(头插法) */
Node * LinkListCreateListHead(int n);
/* 随机产生n个元素的值，建立带头结点的单链线性表(尾插法) */
Node * LinkListCreateListTail(int n);
/* 顺序线性表L已经存在，将它重置为空表 */
Status LinkListClearList(Node **headerNode);

/* 测试demo */
void linkListTestDemo();

/* 链表其他常见操作合集测试demo */
void extraLinkTestDemo();

#endif //CDEMO_LINKLIST_H
